﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Dao;
using Dao.Intermediarios;

namespace _InformaticaIndustrial_DerivdosVinicos.Interfaz
{
    public partial class ModificarOP : Form
    {
        #region Property
        OrdenProduccion ord=new OrdenProduccion();
        IPDetalleOP ipOP = new IPDetalleOP();
        IPProducto ipProd=new IPProducto();
        IPEstructuraProducto ipEP=new IPEstructuraProducto();
        IPMateriaPrima ipMP=new IPMateriaPrima();
        IPComponente ipComp=new IPComponente();
        IList<DetalleOP> detalles = new List<DetalleOP>();
        IList<Producto> productos=new List<Producto>();
        #endregion Property

        public ModificarOP(OrdenProduccion orden)
        {
            InitializeComponent();
            txtNroOP.Text = orden.nroOP.ToString();
            ord = orden;
        }

        private void cbEstados_SelectedIndexChanged(object sender, EventArgs e)
        {
            modificarEstado();
        }
        public void modificarEstado()
        {
            //si la op es cancelada, debe volver a sumar el stock
            //buscar los detalles
            //buscar la mp o comp d esos detalles y volver a sumar el stock
            string nvoEstado = cbEstados.SelectedItem.ToString();

            if (nvoEstado == "Cancelada")
            { 
               detalles=ipOP.getCriterioById<DetalleOP>("","",Convert.ToInt16(ord.idOP));

               foreach(var d in detalles)
               { 
                  productos= ipProd.getByCriterio<Producto>("IdProducto","=",d.IdProducto.ToString()); 
                 
                   foreach(var p in productos){
                     List<EstructuraProducto> listaEP = ipEP.getByCriterio<EstructuraProducto>("IdProducto", "=", p.IdProducto.ToString());
                     IList<MateriaPrima>mp;
                     IList<Componente>comp;
                     int cantMPNecesaria;
                      int cantPCNecesario;
                   
                       foreach(var ep in listaEP){
                 //por cada materia prima/componente que utiliza, obtener la cantidad por producto
                         if (ep.IdMateriaPrima != null){

                           cantMPNecesaria =d.cantidad*Convert.ToInt16(ep.cantidadMP);
                            mp= ipMP.getCriterioById<MateriaPrima>("IdMP","=", Convert.ToInt16(ep.IdMateriaPrima));
                       //MateriaPrima m=mp.ElementAt(0);
                       foreach (var m in mp)
                       {
                               m.cantidad = m.cantidad + cantMPNecesaria;
                               Intermediario.confirmarCambios();
                       }
                   }

                   if (ep.IdComponente != null)
                   {
                       cantPCNecesario = d.cantidad * Convert.ToInt16(ep.cantidadPC);
                       comp = ipComp.getCriterioById<Componente>("IdComponente", "=",Convert.ToInt16(ep.IdComponente));
                       //Componente c=comp.ElementAt(0);
                       foreach (var c in comp)
                       {
                               c.cantidad = c.cantidad + cantPCNecesario;
                               Intermediario.confirmarCambios();
                       }
                    } 
                           ord.estado="Cancelada";
                   }
                  }
               
            }
           }   //actualizar el stock del producto
            else if (nvoEstado == "Completada")
            {
                ord.estado = "Completada";

                detalles = ipOP.getCriterioById<DetalleOP>("", "", Convert.ToInt16(ord.idOP));

                foreach (var d in detalles)
                {
                    productos = ipProd.getByCriterio<Producto>("IdProducto", "=", d.IdProducto.ToString());

                    foreach (var p in productos)
                    {
                        p.stock = p.stock + Convert.ToInt16(d.cantidad);
                    }
                }
            }
            else if (nvoEstado == "En Curso")

                ord.estado = "En Curso";
            
               // Intermediario.confirmarCambios();
            }

        private void dtFechaEjecucion_ValueChanged(object sender, EventArgs e)
        {
            ord.fechaEjecucion=Convert.ToDateTime(dtFechaEjecucion.Value);
          //  Intermediario.confirmarCambios();
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {
            string nvoEstado = cbEstados.SelectedItem.ToString();

            if (nvoEstado == "Cancelada")
            {
                //detalles = ipOP.getCriterioById<DetalleOP>("", "", Convert.ToInt16(ord.idOP));

                //foreach (var d in detalles)
                //{
                //    productos = ipProd.getByCriterio<Producto>("IdProducto", "=", d.IdProducto.ToString());

                //    foreach (var p in productos)
                //    {
                //        List<EstructuraProducto> listaEP = ipEP.getByCriterio<EstructuraProducto>("IdProducto", "=", p.IdProducto.ToString());
                //        IList<MateriaPrima> mp;
                //        IList<Componente> comp;
                //        int cantMPNecesaria;
                //        int cantPCNecesario;

                //        foreach (var ep in listaEP)
                //        {
                //            //por cada materia prima/componente que utiliza, obtener la cantidad por producto
                //            if (ep.IdMateriaPrima != null)
                //            {

                //                cantMPNecesaria = d.cantidad * Convert.ToInt16(ep.cantidadMP);
                //                mp = ipMP.getCriterioById<MateriaPrima>("IdMP", "=", Convert.ToInt16(ep.IdMateriaPrima));
                //                //MateriaPrima m=mp.ElementAt(0);
                //                foreach (var m in mp)
                //                {
                //                    m.cantidad = m.cantidad + cantMPNecesaria;
                //                    Intermediario.confirmarCambios();
                //                }
                //            }

                //            if (ep.IdComponente != null)
                //            {
                //                cantPCNecesario = d.cantidad * Convert.ToInt16(ep.cantidadPC);
                //                comp = ipComp.getCriterioById<Componente>("IdComponente", "=", Convert.ToInt16(ep.IdComponente));
                //                //Componente c=comp.ElementAt(0);
                //                foreach (var c in comp)
                //                {
                //                    c.cantidad = c.cantidad + cantPCNecesario;
                //                    Intermediario.confirmarCambios();
                //                }
                //            }
                //            ord.estado = "Cancelada";
                //        }
                //    }

                //}

                ord.estado = "Cancelada";
            }   //actualizar el stock del producto
            else if (nvoEstado == "Completada")
            {
                ord.estado = "Completada";

                detalles = ipOP.getCriterioById<DetalleOP>("", "", Convert.ToInt16(ord.idOP));

                foreach (var d in detalles)
                {
                    productos = ipProd.getByCriterio<Producto>("IdProducto", "=", d.IdProducto.ToString());

                    foreach (var p in productos)
                    {
                        p.stock = p.stock + Convert.ToInt16(d.cantidad);
                    }
                }
            }
            else if (nvoEstado == "En Curso")
                ord.estado = "En Curso";

            Intermediario.confirmarCambios();
            MessageBox.Show("La Orden de Producción ha sido modificada.");
        }

        private void btSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

